]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
appDisplay: Handle non-UTF8 filename encodings more gracefully
authorFlorian Müllner <fmuellner@gnome.org>
Thu, 30 Jul 2015 17:55:19 +0000 (19:55 +0200)
committerFlorian Müllner <fmuellner@gnome.org>
Fri, 31 Jul 2015 14:52:42 +0000 (16:52 +0200)
It may be 2015, but users still stumble upon the occasional .desktop
file that uses a filename encoding other than UTF-8. We currently
fail quite spectacularly in that case by not displaying any apps at
all - handle this case more gracefully, by only filtering out the
offending apps.

https://bugzilla.gnome.org/show_bug.cgi?id=651503

js/ui/appDisplay.js
src/shell-app-system.c
src/shell-app-system.h

index 37cc5ebe0b9bccad5381ae42120cc6dc2a9f102f..58adf3a3265fbbd33b184265f00f611ed39e1a66 100644 (file)
@@ -500,6 +500,11 @@ const AllView = new Lang.Class({
 
     _loadApps: function() {
         let apps = Gio.AppInfo.get_all().filter(function(appInfo) {
+            try {
+                let id = appInfo.get_id(); // catch invalid file encodings
+            } catch(e) {
+                return false;
+            }
             return appInfo.should_show();
         }).map(function(app) {
             return app.get_id();
@@ -1061,7 +1066,7 @@ const AppSearchProvider = new Lang.Class({
 
     getInitialResultSet: function(terms, callback, cancellable) {
         let query = terms.join(' ');
-        let groups = Gio.DesktopAppInfo.search(query);
+        let groups = Shell.AppSystem.search(query);
         let usage = Shell.AppUsage.get_default();
         let results = [];
         groups.forEach(function(group) {
@@ -1290,7 +1295,10 @@ const FolderIcon = new Lang.Class({
             if (!_listsIntersect(folderCategories, appCategories))
                 return;
 
-            addAppId(appInfo.get_id());
+            try {
+                addAppId(appInfo.get_id()); // catch invalid file encodings
+            } catch(e) {
+            }
         });
 
         this.actor.visible = this.view.getAllItems().length > 0;
index a45da0d617a59d1754c8ed0c01ce259331fb8182..77878e93e9fbc7f2a5960071e0969038143a4e6e 100644 (file)
@@ -383,3 +383,27 @@ shell_app_system_get_running (ShellAppSystem *self)
 
   return ret;
 }
+
+/**
+ * shell_app_system_search:
+ * @search_string: the search string to use
+ *
+ * Wrapper around g_desktop_app_info_search() that replaces results that
+ * don't validate as UTF-8 with the empty string.
+ *
+ * Returns: (array zero-terminated=1) (element-type GStrv) (transfer full): a
+ *   list of strvs.  Free each item with g_strfreev() and free the outer
+ *   list with g_free().
+ */
+char ***
+shell_app_system_search (const char *search_string)
+{
+    char ***results = g_desktop_app_info_search (search_string);
+
+    for (char ***groups = results; *groups; groups++)
+      for (char **ids = *groups; *ids; ids++)
+        if (!g_utf8_validate (*ids, -1, NULL))
+          **ids = '\0';
+
+      return results;
+}
index c0c501ad7a0259acdbed8a34138a3d3acc11e741..16a2c550fa29c36cd31b4f29d2878b9ff74451c5 100644 (file)
@@ -48,5 +48,6 @@ ShellApp       *shell_app_system_lookup_desktop_wmclass       (ShellAppSystem *s
                                                                const char     *wmclass);
 
 GSList         *shell_app_system_get_running               (ShellAppSystem  *self);
+char         ***shell_app_system_search                    (const char *search_string);
 
 #endif /* __SHELL_APP_SYSTEM_H__ */